#ifndef ARCHIVO_H_
#define ARCHIVO_H_

#include "Almacenamiento.h"
#include <string>
#include <fstream>

namespace Toolkit
{

class Archivo: public Almacenamiento
{

public:
	/**
	 * Construir un nuevo archivo.
	 * */
	Archivo (const unsigned long int &tamanoUnidad, const string& ruta, const string& nombre,
		const TipoSerializacion& tserializacion, const stringstream &metadata, const TipoSerializacion &tSerializacionArchivosControl = TEXTO);
	
	/*
	 * Construir un nuevo archivo, con un tamaño excepcional para la raiz.
	 */
	Archivo (const unsigned long int &tamanoUnidad, const string& ruta, const string& nombre,
	        const TipoSerializacion& tserializacion, const stringstream &metadata, const unsigned long int & tamanoUnidadPrimera,
	        const TipoSerializacion &tSerializacionArchivosControl = TEXTO);

	/**
	 * Recuperar un archivo usado antes.
	 * */
	Archivo (const string& ruta, const string& nombre,
		const TipoSerializacion& tserializacion, const TipoSerializacion &tSerializacionArchivosControl = TEXTO);
	

    virtual ~Archivo();

	/**
	 * Carga en el stream especificado la metadata presente en el encabezado del archivo.
	 * */
	virtual void leerMetaData(stringstream &metadata);	
	
	/**
	 * Reemplaza la metadata presente en el archivo, con aquella pasada por parámetro.
	 * Se asume que tiene el mismo tamaño que la anterior.
	 * */
	virtual void actualizarMetadata(stringstream &metadata);

	virtual void borrarContenido();


private:
	string ruta, nombre, extensionArchivo, extensionControl;
	unsigned long int tamanoMetadata;
	TipoSerializacion tSerializacionArchivosControl;

	void construirArchivo(const unsigned long int &tamanoUnidad, const string& ruta, const string& nombre,
	        const TipoSerializacion& tserializacion, const stringstream &metadata, const unsigned long int & tamanoUnidadPrimera,
	        const TipoSerializacion &tSerializacionArchivosControl = TEXTO);

	string obtenerExtension(const TipoSerializacion &tSerializacion);

	void siExisteArchivoRemover(const string &ruta, const string &nombre, const string &extension, const TipoSerializacion &tSerializacion);

  	/**
	 * Crea el archivo con el nombre pasado, y lo deja abierto para lectura escritura. 
	 * */
	fstream *crearArchivo(const string &ruta, const string &nombre, const string &extension, const TipoSerializacion &tserializacion);

};

}
#endif /* ARCHIVO_H_ */
